//
// Created on 6/1/25.
//
// Node APIs are not fully supported. To solve the compilation error of the interface cannot be found,
// please include "napi/native_api.h".

#ifndef NEURONVIEW_TRACKBALL_H
#define NEURONVIEW_TRACKBALL_H

#include <glm/glm.hpp>
#include <glm/gtc/quaternion.hpp>

class Trackball {
public:
    Trackball(float radius = 1.0f);
    
    // 设置轨迹球半径
    void setRadius(float radius);
    
    // 开始拖动
    void startDrag(int x, int y);
    
    // 拖动过程
    void drag(int x, int y);

    
    // 获取旋转矩阵
    glm::mat4 getRotationMatrix() const;
    
    // 重置旋转
    void reset();
    
    // 获取当前窗口尺寸
    void setWindowSize(int width, int height);
    void setDragging(bool drag){m_isDragging=drag;}
private:
    // 将屏幕坐标映射到轨迹球上的3D点
    glm::vec3 mapToSphere(int x, int y) const;
    
    float m_radius;             // 轨迹球半径
    int m_windowWidth;          // 窗口宽度
    int m_windowHeight;         // 窗口高度
    glm::quat m_currentRotation;// 当前旋转四元数
    glm::quat m_lastRotation;   // 上一次旋转四元数
    glm::vec3 m_startPoint;     // 拖动起点
    bool m_isDragging;          // 是否正在拖动
};


#endif // NEURONVIEW_TRACKBALL_H
